package 泛型;

import java.util.Arrays;

/*编译器如果能自动推断出泛型类型，就可以省略后面的泛型类型。例如，对于下面的代码：

List<Number> list = new ArrayList<Number>();

编译器看到泛型类型List<Number>就可以自动推断出后面的ArrayList<T>的泛型类型必须是ArrayList<Number>，因此，可以把代码简写为：

List<Number> list = new ArrayList<>();

可以省略后面的Number，编译器可以自动推断泛型类型.*/

/*泛型接口
除了ArrayList<T>使用了泛型，还可以在接口中使用泛型。例如，Arrays.sort(Object[])可以对任意数组进行排序，但待排序的元素必须
实现Comparable<T>这个泛型接口：

public interface Comparable<T> {

	//抽象方法comparaTo的返回值：   
	//  返回负数: 当前实例比参数o小
	//  返回0: 当前实例与参数o相等
	//  返回正数: 当前实例比参数o大
   public int compareTo(T o);
}
Object[]中的元素为String、Integer等都已实现Comparable接口，可以直接排序。如：可以直接对String数组进行排序：
String
Integer
// sort
import java.util.Arrays;*/
/*
public class 使用泛型 {
    public static void main(String[] args) {
        String[] ss = new String[] { "Orange", "Apple", "Pear" };
        Arrays.sort(ss);//ss属String数组，String本身已经实现了Comparable<String>接口,
        System.out.println(Arrays.toString(ss));

    }
}
*/
//因为String本身已经实现了Comparable<String>接口。如果换成我们自定义的Person类型,无法将Person转型为Comparable。
//我们必须修改代码，让Person实现Comparable<T>接口：

public class 使用泛型 {
	public static void main(String[] args) {
		Person3[] ps = new Person3[] { new Person3("Bob", 61), new Person3("Alice", 88), new Person3("Lily", 75) };
		Arrays.sort(ps);
		System.out.println(Arrays.toString(ps));
	}
}

class Person3 implements Comparable<Person3> {//需要排序比较，就需要实现Comparable<Person3>接口，实现compareTo方法
	String name;
	int score;

	public Person3(String name, int score) {
		super();
		this.name = name;
		this.score = score;
	}

	public String toString() {
		return this.name + "," + this.score;
	}
	
	//按name属性排序
	public int compareTo(Person3 other) {
		return this.name.compareTo(other.name);
	}

	//按score属性排序
//	@Override
//	public int compareTo(Person3 other) {
//		if (this.score > other.score){return 1;}
//		else if (this.score < other.score){return -1;}
//			else{return 0;}
//	}

//基本类型(如：int)之间不能比较，只能转换成引用类型(如:Integer)才能比较：

//	public int compareTo(Person3 other) {
//		return new Integer(this.score).compareTo(new Integer(other.score));
//	}

//	public int compareTo(Person3 other) {
//		return (Integer.valueOf(other.score)).compareTo(Integer.valueOf(this.score));
//	}
}
